package com.homedo.async.mysql.support.dataobject;

import com.blinkfox.zealot.core.ICustomAction;
import com.blinkfox.zealot.core.ZealotKhala;

import java.util.Collection;

/**
 * @author jgshun
 * @date 2020/3/24 4:56 PM
 */
public class Example {

    private ZealotKhala khala;

    private Example() {
    }

    /**
     * 开始的方法.
     *
     * @return Example实例
     */
    public static Example start() {
        Example example = new Example();

        example.khala = ZealotKhala.start();
        return example;
    }

    /**
     * 结束SQL拼接流程，并生成最终的sqlInfo信息.
     *
     * @return sqlInfo
     */
    public SqlInfo end() {
        com.blinkfox.zealot.bean.SqlInfo sqlInfo = this.khala.end();

        return new SqlInfo(sqlInfo.getSql(), sqlInfo.getParams());
    }

    /**
     * 拼接并带上'INSERT_INTO'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example insertInto(String text) {
        this.khala.insertInto(text);
        return this;
    }

    /**
     * 拼接并带上'VALUES'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example values(String text) {
        this.khala.values(text);
        return this;
    }

    /**
     * 拼接并带上'DELETE FROM'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example deleteFrom(String text) {
        this.khala.deleteFrom(text);
        return this;
    }

    /**
     * 拼接并带上'UPDATE'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example update(String text) {
        this.khala.update(text);
        return this;
    }

    /**
     * 拼接并带上'SELECT'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example select(String text) {
        this.khala.select(text);
        return this;
    }

    /**
     * 拼接并带上'FROM'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example from(String text) {
        this.khala.from(text);
        return this;
    }

    /**
     * 拼接并带上'WHERE'关键字的字符串和动态参数.
     *
     * @param text  文本
     * @param value 参数值
     * @return Example实例
     */
    public Example where(String text, Object... value) {
        this.khala.where(text, value);
        return this;
    }

    /**
     * 拼接并带上'AND'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example and(String text) {
        this.khala.and(text);
        return this;
    }

    /**
     * 拼接并带上'OR'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example or(String text) {
        this.khala.or(text);
        return this;
    }

    /**
     * 拼接并带上'AS'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example as(String text) {
        this.khala.as(text);
        return this;
    }

    /**
     * 拼接并带上'AS'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example set(String text) {
        this.khala.set(text);
        return this;
    }

    /**
     * 拼接并带上'INNER JOIN'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example innerJoin(String text) {
        this.khala.innerJoin(text);
        return this;
    }

    /**
     * 拼接并带上'LEFT JOIN'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example leftJoin(String text) {
        this.khala.leftJoin(text);
        return this;
    }

    /**
     * 拼接并带上'RIGHT JOIN'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example rightJoin(String text) {
        this.khala.rightJoin(text);
        return this;
    }

    /**
     * 拼接并带上'FULL JOIN'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example fullJoin(String text) {
        this.khala.fullJoin(text);
        return this;
    }

    /**
     * 拼接并带上'ON'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example on(String text) {
        this.khala.on(text);
        return this;
    }

    /**
     * 拼接并带上'ORDER BY'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example orderBy(String text) {
        this.khala.orderBy(text);
        return this;
    }

    /**
     * 拼接并带上'GROUP BY'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example groupBy(String text) {
        this.khala.groupBy(text);
        return this;
    }

    /**
     * 拼接并带上'HAVING'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example having(String text) {
        this.khala.having(text);
        return this;
    }

    /**
     * 拼接并带上'LIMIT'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example limit(String text) {
        this.khala.limit(text);
        return this;
    }

    /**
     * 拼接并带上'OFFSET'关键字的字符串.
     *
     * @param text 文本
     * @return Example实例
     */
    public Example offset(String text) {
        this.khala.offset(text);
        return this;
    }

    /**
     * 拼接并带上'ASC'关键字的字符串.
     *
     * @return Example实例
     */
    public Example asc() {
        this.khala.asc();
        return this;
    }

    /**
     * 拼接并带上'DESC'关键字的字符串.
     *
     * @return Example实例
     */
    public Example desc() {
        this.khala.desc();
        return this;
    }

    /**
     * 拼接并带上'UNION'关键字的字符串.
     *
     * @return Example实例
     */
    public Example union() {
        this.khala.union();
        return this;
    }

    /**
     * 拼接并带上'UNION ALL'关键字的字符串.
     *
     * @return Example实例
     */
    public Example unionAll() {
        this.khala.unionAll();
        return this;
    }

    /**
     * 在sql后追加任何文本字符串，后可追加自定义可变参数.
     *
     * @param text   文本
     * @param values 可变参数数组
     * @return Example实例
     */
    public Example text(String text, Object... values) {
        this.khala.text(text, values);
        return this;
    }

    /**
     * 在sql后追加任何文本字符串，后可追加自定义可变参数，如果match为true时，才生成此SQL文本和参数.
     *
     * @param match  匹配条件
     * @param text   文本
     * @param values 可变参数数组
     * @return Example实例
     */
    public Example text(boolean match, String text, Object... values) {
        this.khala.text(match, text, values);
        return this;
    }

    /**
     * 在sql的参数集合后追加不定对象个数的数组.
     *
     * @param values 不定个数的值，也是数组
     * @return Example实例
     */
    public Example param(Object... values) {
        this.khala.param(values);
        return this;
    }

    /**
     * 在sql的参数集合后追加任何的一个集合.
     *
     * @param values 不定个数的值
     * @return Example实例
     */
    public Example param(Collection<?> values) {
        this.khala.param(values);
        return this;
    }

    /**
     * 执行自定义的任意操作.
     *
     * @param action 执行when条件中的方法
     * @return Example实例
     */
    public Example doAnything(ICustomAction action) {
        this.khala.doAnything(action);
        return this;
    }

    /**
     * 当匹配match条件为true时，才执行自定义的任意操作.
     *
     * @param match  匹配条件
     * @param action 执行when条件中的方法
     * @return Example实例
     */
    public Example doAnything(boolean match, ICustomAction action) {
        this.khala.doAnything(match, action);
        return this;
    }

    /**
     * 生成等值查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example equal(String field, Object value) {
        this.khala.equal(field, value);
        return this;
    }

    /**
     * 生成等值查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example equal(String field, Object value, boolean match) {
        this.khala.equal(field, value, match);
        return this;
    }

    /**
     * 生成带" AND "前缀等值查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example andEqual(String field, Object value) {
        this.khala.andEqual(field, value);
        return this;
    }

    /**
     * 生成带" AND "前缀等值查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example andEqual(String field, Object value, boolean match) {
        this.khala.andEqual(field, value, match);
        return this;
    }

    /**
     * 生成带" OR "前缀等值查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example orEqual(String field, Object value) {
        this.khala.orEqual(field, value);
        return this;
    }

    /**
     * 生成带" OR "前缀等值查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example orEqual(String field, Object value, boolean match) {
        this.khala.orEqual(field, value, match);
        return this;
    }

    /**
     * 生成不等查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example notEqual(String field, Object value) {
        this.khala.notEqual(field, value);
        return this;
    }

    /**
     * 生成不等查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example notEqual(String field, Object value, boolean match) {
        this.khala.notEqual(field, value, match);
        return this;
    }

    /**
     * 生成带" AND "前缀不等查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example andNotEqual(String field, Object value) {
        this.khala.andNotEqual(field, value);
        return this;
    }

    /**
     * 生成带" AND "前缀不等查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example andNotEqual(String field, Object value, boolean match) {
        this.khala.andNotEqual(field, value, match);
        return this;
    }

    /**
     * 生成带" OR "前缀不等查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example orNotEqual(String field, Object value) {
        this.khala.orNotEqual(field, value);
        return this;
    }

    /**
     * 生成带" OR "前缀不等查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example orNotEqual(String field, Object value, boolean match) {
        this.khala.orNotEqual(field, value, match);
        return this;
    }

    /**
     * 生成大于查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example moreThan(String field, Object value) {
        this.khala.moreThan(field, value);
        return this;
    }

    /**
     * 生成大于查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example moreThan(String field, Object value, boolean match) {
        this.khala.moreThan(field, value, match);
        return this;
    }

    /**
     * 生成带" AND "前缀大于查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example andMoreThan(String field, Object value) {
        this.khala.andMoreThan(field, value);
        return this;
    }

    /**
     * 生成带" AND "前缀大于查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example andMoreThan(String field, Object value, boolean match) {
        this.khala.andMoreThan(field, value, match);
        return this;
    }

    /**
     * 生成带" OR "前缀大于查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example orMoreThan(String field, Object value) {
        this.khala.orMoreThan(field, value);
        return this;
    }

    /**
     * 生成带" OR "前缀大于查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example orMoreThan(String field, Object value, boolean match) {
        this.khala.orMoreThan(field, value, match);
        return this;
    }

    /**
     * 生成小于查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example lessThan(String field, Object value) {
        this.khala.lessThan(field, value);
        return this;
    }

    /**
     * 生成小于查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example lessThan(String field, Object value, boolean match) {
        this.khala.lessThan(field, value, match);
        return this;
    }

    /**
     * 生成带" AND "前缀小于查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example andLessThan(String field, Object value) {
        this.khala.andLessThan(field, value);
        return this;
    }

    /**
     * 生成带" AND "前缀小于查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example andLessThan(String field, Object value, boolean match) {
        this.khala.andLessThan(field, value, match);
        return this;
    }

    /**
     * 生成带" OR "前缀小于查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example orLessThan(String field, Object value) {
        this.khala.orLessThan(field, value);
        return this;
    }

    /**
     * 生成带" OR "前缀小于查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example orLessThan(String field, Object value, boolean match) {
        this.khala.orLessThan(field, value, match);
        return this;
    }

    /**
     * 生成大于等于查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example moreEqual(String field, Object value) {
        this.khala.moreEqual(field, value);
        return this;
    }

    /**
     * 生成大于等于查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example moreEqual(String field, Object value, boolean match) {
        this.khala.moreEqual(field, value, match);
        return this;
    }

    /**
     * 生成带" AND "前缀大于等于查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example andMoreEqual(String field, Object value) {
        this.khala.andMoreEqual(field, value);
        return this;
    }

    /**
     * 生成带" AND "前缀大于等于查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example andMoreEqual(String field, Object value, boolean match) {
        this.khala.andMoreEqual(field, value, match);
        return this;
    }

    /**
     * 生成带" OR "前缀大于等于查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example orMoreEqual(String field, Object value) {
        this.khala.orMoreEqual(field, value);
        return this;
    }

    /**
     * 生成带" OR "前缀大于等于查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example orMoreEqual(String field, Object value, boolean match) {
        this.khala.orMoreEqual(field, value, match);
        return this;
    }

    /**
     * 生成小于等于查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example lessEqual(String field, Object value) {
        this.khala.lessEqual(field, value);
        return this;
    }

    /**
     * 生成小于等于查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example lessEqual(String field, Object value, boolean match) {
        this.khala.lessEqual(field, value, match);
        return this;
    }

    /**
     * 生成带" AND "前缀小于等于查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example andLessEqual(String field, Object value) {
        this.khala.andLessEqual(field, value);
        return this;
    }

    /**
     * 生成带" AND "前缀小于等于查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example andLessEqual(String field, Object value, boolean match) {
        this.khala.andLessEqual(field, value, match);
        return this;
    }

    /**
     * 生成带" OR "前缀小于等于查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example orLessEqual(String field, Object value) {
        this.khala.orLessEqual(field, value);
        return this;
    }

    /**
     * 生成带" OR "前缀小于等于查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example orLessEqual(String field, Object value, boolean match) {
        this.khala.orLessEqual(field, value, match);
        return this;
    }

    /**
     * 生成like模糊查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example like(String field, Object value) {
        this.khala.like(field, value);
        return this;
    }

    /**
     * 生成like模糊查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example like(String field, Object value, boolean match) {
        this.khala.like(field, value, match);
        return this;
    }

    /**
     * 生成带" AND "前缀的like模糊查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example andLike(String field, Object value) {
        this.khala.andLike(field, value);
        return this;
    }

    /**
     * 生成带" AND "前缀的like模糊查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example andLike(String field, Object value, boolean match) {
        this.khala.andLike(field, value, match);
        return this;
    }

    /**
     * 生成带" OR "前缀的like模糊查询的SQL片段.
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example orLike(String field, Object value) {
        this.khala.orLike(field, value);
        return this;
    }

    /**
     * 生成带" OR "前缀的like模糊查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example orLike(String field, Object value, boolean match) {
        this.khala.orLike(field, value, match);
        return this;
    }

    /**
     * 生成" NOT LIKE "模糊查询的SQL片段.
     * <p>示例：传入 {"b.title", "Spring"} 两个参数，生成的SQL片段为：" b.title NOT LIKE ? ", SQL参数为:{"%Spring%"}</p>
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example notLike(String field, Object value) {
        this.khala.notLike(field, value);
        return this;
    }

    /**
     * 生成" NOT LIKE "模糊查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"b.title", "Spring", true} 三个参数，生成的SQL片段为：" b.title NOT LIKE ? ", SQL参数为:{"%Spring%"}</p>
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example notLike(String field, Object value, boolean match) {
        this.khala.notLike(field, value, match);
        return this;
    }

    /**
     * 生成带" AND "前缀的" NOT LIKE "模糊查询的SQL片段.
     * <p>示例：传入 {"b.title", "Spring"} 两个参数，生成的SQL片段为：" AND b.title NOT LIKE ? ", SQL参数为:{"%Spring%"}</p>
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example andNotLike(String field, Object value) {
        this.khala.andNotLike(field, value);
        return this;
    }

    /**
     * 生成带" AND "前缀的" NOT LIKE "模糊查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"b.title", "Spring", true} 三个参数，生成的SQL片段为：" AND b.title NOT LIKE ? ", SQL参数为:{"%Spring%"}</p>
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example andNotLike(String field, Object value, boolean match) {
        this.khala.andNotLike(field, value, match);
        return this;
    }

    /**
     * 生成带" OR "前缀的" NOT LIKE "模糊查询的SQL片段.
     * <p>示例：传入 {"b.title", "Spring"} 两个参数，生成的SQL片段为：" OR b.title NOT LIKE ? ", SQL参数为:{"%Spring%"}</p>
     *
     * @param field 数据库字段
     * @param value 值
     * @return Example实例
     */
    public Example orNotLike(String field, Object value) {
        this.khala.orNotLike(field, value);
        return this;
    }

    /**
     * 生成带" OR "前缀的" NOT LIKE "模糊查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"b.title", "Spring", true} 三个参数，生成的SQL片段为：" OR b.title NOT LIKE ? ", SQL参数为:{"%Spring%"}</p>
     *
     * @param field 数据库字段
     * @param value 值
     * @param match 是否匹配
     * @return Example实例
     */
    public Example orNotLike(String field, Object value, boolean match) {
        this.khala.orNotLike(field, value, match);
        return this;
    }

    /**
     * 根据指定的模式字符串生成like模糊查询的SQL片段.
     * <p>示例：传入 {"b.title", "Java%"} 两个参数，生成的SQL片段为：" b.title LIKE 'Java%' "</p>
     *
     * @param field   数据库字段
     * @param pattern 模式字符串
     * @return Example实例
     */
    public Example likePattern(String field, String pattern) {
        this.khala.likePattern(field, pattern);
        return this;
    }

    /**
     * 根据指定的模式字符串生成like模糊查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"b.title", "Java%", true} 三个参数，生成的SQL片段为：" b.title LIKE 'Java%' "</p>
     * <p>示例：传入 {"b.title", "Java%", false} 三个参数，生成的SQL片段为空字符串.</p>
     *
     * @param field   数据库字段
     * @param pattern 模式字符串
     * @param match   是否匹配
     * @return Example实例
     */
    public Example likePattern(String field, String pattern, boolean match) {
        this.khala.likePattern(field, pattern, match);
        return this;
    }

    /**
     * 根据指定的模式字符串生成带" AND "前缀的like模糊查询的SQL片段.
     * <p>示例：传入 {"b.title", "Java%"} 两个参数，生成的SQL片段为：" AND b.title LIKE 'Java%' "</p>
     *
     * @param field   数据库字段
     * @param pattern 模式字符串
     * @return Example实例
     */
    public Example andLikePattern(String field, String pattern) {
        this.khala.andLikePattern(field, pattern);
        return this;
    }

    /**
     * 根据指定的模式字符串生成带" AND "前缀的like模糊查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"b.title", "Java%", true} 三个参数，生成的SQL片段为：" AND b.title LIKE 'Java%' "</p>
     * <p>示例：传入 {"b.title", "Java%", false} 三个参数，生成的SQL片段为空字符串.</p>
     *
     * @param field   数据库字段
     * @param pattern 模式字符串
     * @param match   是否匹配
     * @return Example实例
     */
    public Example andLikePattern(String field, String pattern, boolean match) {
        this.khala.andLikePattern(field, pattern, match);
        return this;
    }

    /**
     * 根据指定的模式字符串生成带" OR "前缀的like模糊查询的SQL片段.
     * <p>示例：传入 {"b.title", "Java%"} 两个参数，生成的SQL片段为：" OR b.title LIKE 'Java%' "</p>
     *
     * @param field   数据库字段
     * @param pattern 模式字符串
     * @return Example实例
     */
    public Example orLikePattern(String field, String pattern) {
        this.khala.orLikePattern(field, pattern);
        return this;
    }

    /**
     * 根据指定的模式字符串生成带" OR "前缀的like模糊查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"b.title", "Java%", true} 三个参数，生成的SQL片段为：" OR b.title LIKE 'Java%' "</p>
     * <p>示例：传入 {"b.title", "Java%", false} 三个参数，生成的SQL片段为空字符串.</p>
     *
     * @param field   数据库字段
     * @param pattern 模式字符串
     * @param match   是否匹配
     * @return Example实例
     */
    public Example orLikePattern(String field, String pattern, boolean match) {
        this.khala.orLikePattern(field, pattern, match);
        return this;
    }

    /**
     * 根据指定的模式字符串生成" NOT LIKE "模糊查询的SQL片段.
     * <p>示例：传入 {"b.title", "Java%"} 两个参数，生成的SQL片段为：" b.title NOT LIKE 'Java%' "</p>
     *
     * @param field   数据库字段
     * @param pattern 模式字符串
     * @return Example实例
     */
    public Example notLikePattern(String field, String pattern) {
        this.khala.notLikePattern(field, pattern);
        return this;
    }

    /**
     * 根据指定的模式字符串生成" NOT LIKE "模糊查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"b.title", "Java%", true} 三个参数，生成的SQL片段为：" b.title NOT LIKE 'Java%' "</p>
     * <p>示例：传入 {"b.title", "Java%", false} 三个参数，生成的SQL片段为空字符串.</p>
     *
     * @param field   数据库字段
     * @param pattern 模式字符串
     * @param match   是否匹配
     * @return Example实例
     */
    public Example notLikePattern(String field, String pattern, boolean match) {
        this.khala.notLikePattern(field, pattern, match);
        return this;
    }

    /**
     * 根据指定的模式字符串生成带" AND "前缀的" NOT LIKE "模糊查询的SQL片段.
     * <p>示例：传入 {"b.title", "Java%"} 两个参数，生成的SQL片段为：" AND b.title NOT LIKE 'Java%' "</p>
     *
     * @param field   数据库字段
     * @param pattern 模式字符串
     * @return Example实例
     */
    public Example andNotLikePattern(String field, String pattern) {
        this.khala.andNotLikePattern(field, pattern);
        return this;
    }

    /**
     * 根据指定的模式字符串生成带" AND "前缀的" NOT LIKE "模糊查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"b.title", "Java%", true} 三个参数，生成的SQL片段为：" AND b.title NOT LIKE 'Java%' "</p>
     * <p>示例：传入 {"b.title", "Java%", false} 三个参数，生成的SQL片段为空字符串.</p>
     *
     * @param field   数据库字段
     * @param pattern 模式字符串
     * @param match   是否匹配
     * @return Example实例
     */
    public Example andNotLikePattern(String field, String pattern, boolean match) {
        this.khala.andNotLikePattern(field, pattern, match);
        return this;
    }

    /**
     * 根据指定的模式字符串生成带" OR "前缀的" NOT LIKE "模糊查询的SQL片段.
     * <p>示例：传入 {"b.title", "Java%"} 两个参数，生成的SQL片段为：" OR b.title NOT LIKE 'Java%' "</p>
     *
     * @param field   数据库字段
     * @param pattern 模式字符串
     * @return Example实例
     */
    public Example orNotLikePattern(String field, String pattern) {
        this.khala.orNotLikePattern(field, pattern);
        return this;
    }

    /**
     * 根据指定的模式字符串生成带" OR "前缀的" NOT LIKE "模糊查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"b.title", "Java%", true} 三个参数，生成的SQL片段为：" OR b.title NOT LIKE 'Java%' "</p>
     * <p>示例：传入 {"b.title", "Java%", false} 三个参数，生成的SQL片段为空字符串.</p>
     *
     * @param field   数据库字段
     * @param pattern 模式字符串
     * @param match   是否匹配
     * @return Example实例
     */
    public Example orNotLikePattern(String field, String pattern, boolean match) {
        this.khala.orNotLikePattern(field, pattern, match);
        return this;
    }

    /**
     * 生成between区间查询的SQL片段(当某一个值为null时，会是大于等于或小于等于的情形).
     *
     * @param field      数据库字段
     * @param startValue 开始值
     * @param endValue   结束值
     * @return Example实例
     */
    public Example between(String field, Object startValue, Object endValue) {
        this.khala.between(field, startValue, endValue);
        return this;
    }

    /**
     * 生成between区间查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成(当某一个值为null时，会是大于等于或小于等于的情形).
     *
     * @param field      数据库字段
     * @param startValue 开始值
     * @param endValue   结束值
     * @param match      是否匹配
     * @return Example实例
     */
    public Example between(String field, Object startValue, Object endValue, boolean match) {
        this.khala.between(field, startValue, endValue, match);
        return this;
    }

    /**
     * 生成带" AND "前缀的between区间查询的SQL片段(当某一个值为null时，会是大于等于或小于等于的情形).
     *
     * @param field      数据库字段
     * @param startValue 开始值
     * @param endValue   结束值
     * @return Example实例
     */
    public Example andBetween(String field, Object startValue, Object endValue) {
        this.khala.andBetween(field, startValue, endValue);
        return this;
    }

    /**
     * 生成带" AND "前缀的between区间查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成(当某一个值为null时，会是大于等于或小于等于的情形).
     *
     * @param field      数据库字段
     * @param startValue 开始值
     * @param endValue   结束值
     * @param match      是否匹配
     * @return Example实例
     */
    public Example andBetween(String field, Object startValue, Object endValue, boolean match) {
        this.khala.andBetween(field, startValue, endValue, match);
        return this;
    }

    /**
     * 生成带" OR "前缀的between区间查询的SQL片段(当某一个值为null时，会是大于等于或小于等于的情形).
     *
     * @param field      数据库字段
     * @param startValue 开始值
     * @param endValue   结束值
     * @return Example实例
     */
    public Example orBetween(String field, Object startValue, Object endValue) {
        this.khala.orBetween(field, startValue, endValue);
        return this;
    }

    /**
     * 生成带" OR "前缀的between区间查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成(当某一个值为null时，会是大于等于或小于等于的情形).
     *
     * @param field      数据库字段
     * @param startValue 开始值
     * @param endValue   结束值
     * @param match      是否匹配
     * @return Example实例
     */
    public Example orBetween(String field, Object startValue, Object endValue, boolean match) {
        this.khala.orBetween(field, startValue, endValue, match);
        return this;
    }

    /**
     * 生成in范围查询的SQL片段.
     *
     * @param field  数据库字段
     * @param values 数组的值
     * @return Example实例
     */
    public Example in(String field, Object[] values) {
        this.khala.in(field, values);
        return this;
    }

    /**
     * 生成in范围查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field  数据库字段
     * @param values 数组的值
     * @param match  是否匹配
     * @return Example实例
     */
    public Example in(String field, Object[] values, boolean match) {
        this.khala.in(field, values, match);
        return this;
    }

    /**
     * 生成in范围查询的SQL片段.
     *
     * @param field  数据库字段
     * @param values 集合的值
     * @return Example实例
     */
    public Example in(String field, Collection<?> values) {
        this.khala.in(field, values);
        return this;
    }

    /**
     * 生成in范围查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field  数据库字段
     * @param values 集合的值
     * @param match  是否匹配
     * @return Example实例
     */
    public Example in(String field, Collection<?> values, boolean match) {
        this.khala.in(field, values, match);
        return this;
    }

    /**
     * 生成带" AND "前缀的in范围查询的SQL片段.
     *
     * @param field  数据库字段
     * @param values 数组的值
     * @return Example实例
     */
    public Example andIn(String field, Object[] values) {
        this.khala.andIn(field, values);
        return this;
    }

    /**
     * 生成带" AND "前缀的in范围查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field  数据库字段
     * @param values 数组的值
     * @param match  是否匹配
     * @return Example实例
     */
    public Example andIn(String field, Object[] values, boolean match) {
        this.khala.andIn(field, values, match);
        return this;
    }

    /**
     * 生成带" AND "前缀的in范围查询的SQL片段.
     *
     * @param field  数据库字段
     * @param values 集合的值
     * @return Example实例
     */
    public Example andIn(String field, Collection<?> values) {
        this.khala.andIn(field, values);
        return this;
    }

    /**
     * 生成带" AND "前缀的in范围查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field  数据库字段
     * @param values 集合的值
     * @param match  是否匹配
     * @return Example实例
     */
    public Example andIn(String field, Collection<?> values, boolean match) {
        this.khala.andIn(field, values, match);
        return this;
    }

    /**
     * 生成带" OR "前缀的in范围查询的SQL片段.
     *
     * @param field  数据库字段
     * @param values 数组的值
     * @return Example实例
     */
    public Example orIn(String field, Object[] values) {
        this.khala.orIn(field, values);
        return this;
    }

    /**
     * 生成带" OR "前缀的in范围查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field  数据库字段
     * @param values 数组的值
     * @param match  是否匹配
     * @return Example实例
     */
    public Example orIn(String field, Object[] values, boolean match) {
        this.khala.orIn(field, values, match);
        return this;
    }

    /**
     * 生成带" OR "前缀的in范围查询的SQL片段.
     *
     * @param field  数据库字段
     * @param values 集合的值
     * @return Example实例
     */
    public Example orIn(String field, Collection<?> values) {
        this.khala.orIn(field, values);
        return this;
    }

    /**
     * 生成带" OR "前缀的in范围查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field  数据库字段
     * @param values 集合的值
     * @param match  是否匹配
     * @return Example实例
     */
    public Example orIn(String field, Collection<?> values, boolean match) {
        this.khala.orIn(field, values, match);
        return this;
    }

    /**
     * 生成" NOT IN "范围查询的SQL片段.
     *
     * @param field  数据库字段
     * @param values 数组的值
     * @return Example实例
     */
    public Example notIn(String field, Object[] values) {
        this.khala.notIn(field, values);
        return this;
    }

    /**
     * 生成" NOT IN "范围查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field  数据库字段
     * @param values 数组的值
     * @param match  是否匹配
     * @return Example实例
     */
    public Example notIn(String field, Object[] values, boolean match) {
        this.khala.notIn(field, values, match);
        return this;
    }

    /**
     * 生成" NOT IN "范围查询的SQL片段.
     *
     * @param field  数据库字段
     * @param values 集合的值
     * @return Example实例
     */
    public Example notIn(String field, Collection<?> values) {
        this.khala.notIn(field, values);
        return this;
    }

    /**
     * 生成" NOT IN "范围查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field  数据库字段
     * @param values 集合的值
     * @param match  是否匹配
     * @return Example实例
     */
    public Example notIn(String field, Collection<?> values, boolean match) {
        this.khala.notIn(field, values, match);
        return this;
    }

    /**
     * 生成带" AND "前缀的" NOT IN "范围查询的SQL片段.
     *
     * @param field  数据库字段
     * @param values 数组的值
     * @return Example实例
     */
    public Example andNotIn(String field, Object[] values) {
        this.khala.andNotIn(field, values);
        return this;
    }

    /**
     * 生成带" AND "前缀的" NOT IN "范围查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field  数据库字段
     * @param values 数组的值
     * @param match  是否匹配
     * @return Example实例
     */
    public Example andNotIn(String field, Object[] values, boolean match) {
        this.khala.andNotIn(field, values, match);
        return this;
    }

    /**
     * 生成带" AND "前缀的" NOT IN "范围查询的SQL片段.
     *
     * @param field  数据库字段
     * @param values 集合的值
     * @return Example实例
     */
    public Example andNotIn(String field, Collection<?> values) {
        this.khala.andNotIn(field, values);
        return this;
    }

    /**
     * 生成带" AND "前缀的" NOT IN "范围查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field  数据库字段
     * @param values 集合的值
     * @param match  是否匹配
     * @return Example实例
     */
    public Example andNotIn(String field, Collection<?> values, boolean match) {
        this.khala.andNotIn(field, values, match);
        return this;
    }

    /**
     * 生成带" OR "前缀的" NOT IN "范围查询的SQL片段.
     *
     * @param field  数据库字段
     * @param values 数组的值
     * @return Example实例
     */
    public Example orNotIn(String field, Object[] values) {
        this.khala.orNotIn(field, values);
        return this;
    }

    /**
     * 生成带" OR "前缀的" NOT IN "范围查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field  数据库字段
     * @param values 数组的值
     * @param match  是否匹配
     * @return Example实例
     */
    public Example orNotIn(String field, Object[] values, boolean match) {
        this.khala.orNotIn(field, values, match);
        return this;
    }

    /**
     * 生成带" OR "前缀的" NOT IN "范围查询的SQL片段.
     *
     * @param field  数据库字段
     * @param values 集合的值
     * @return Example实例
     */
    public Example orNotIn(String field, Collection<?> values) {
        this.khala.orNotIn(field, values);
        return this;
    }

    /**
     * 生成带" OR "前缀的" NOT IN "范围查询的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     *
     * @param field  数据库字段
     * @param values 集合的值
     * @param match  是否匹配
     * @return Example实例
     */
    public Example orNotIn(String field, Collection<?> values, boolean match) {
        this.khala.orNotIn(field, values, match);
        return this;
    }

    /**
     * 生成" IS NULL "的SQL片段.
     * <p>示例：传入 {"a.name"} 参数，生成的SQL片段为：" a.name IS NULL "</p>
     *
     * @param field 数据库字段
     * @return Example实例
     */
    public Example isNull(String field) {
        this.khala.isNull(field);
        return this;
    }

    /**
     * 生成" IS NULL "的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"a.name", true} 两个参数，生成的SQL片段为：" a.name IS NULL "</p>
     *
     * @param field 数据库字段
     * @param match 是否匹配
     * @return Example实例
     */
    public Example isNull(String field, boolean match) {
        this.khala.isNull(field, match);
        return this;
    }

    /**
     * 生成带" AND "前缀" IS NULL "的SQL片段.
     * <p>示例：传入 {"a.name"} 参数，生成的SQL片段为：" AND a.name IS NULL "</p>
     *
     * @param field 数据库字段
     * @return Example实例
     */
    public Example andIsNull(String field) {
        this.khala.andIsNull(field);
        return this;
    }

    /**
     * 生成带" AND "前缀" IS NULL "的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"a.name", true} 两个参数，生成的SQL片段为：" AND a.name IS NULL "</p>
     *
     * @param field 数据库字段
     * @param match 是否匹配
     * @return Example实例
     */
    public Example andIsNull(String field, boolean match) {
        this.khala.andIsNull(field, match);
        return this;
    }

    /**
     * 生成带" OR "前缀" IS NULL "的SQL片段.
     * <p>示例：传入 {"a.name"} 参数，生成的SQL片段为：" OR a.name IS NULL "</p>
     *
     * @param field 数据库字段
     * @return Example实例
     */
    public Example orIsNull(String field) {
        this.khala.orIsNull(field);
        return this;
    }

    /**
     * 生成带" OR "前缀" IS NULL "的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"a.name", true} 两个参数，生成的SQL片段为：" OR a.name IS NULL "</p>
     *
     * @param field 数据库字段
     * @param match 是否匹配
     * @return Example实例
     */
    public Example orIsNull(String field, boolean match) {
        this.khala.orIsNull(field, match);
        return this;
    }

    /**
     * 生成" IS NOT NULL "的SQL片段.
     * <p>示例：传入 {"a.name"} 参数，生成的SQL片段为：" a.name IS NOT NULL "</p>
     *
     * @param field 数据库字段
     * @return Example实例
     */
    public Example isNotNull(String field) {
        this.khala.isNotNull(field);
        return this;
    }

    /**
     * 生成" IS NOT NULL "的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"a.name", true} 两个参数，生成的SQL片段为：" a.name IS NOT NULL "</p>
     *
     * @param field 数据库字段
     * @param match 是否匹配
     * @return Example实例
     */
    public Example isNotNull(String field, boolean match) {
        this.khala.isNotNull(field, match);
        return this;
    }

    /**
     * 生成带" AND "前缀" IS NOT NULL "的SQL片段.
     * <p>示例：传入 {"a.name"} 参数，生成的SQL片段为：" AND a.name IS NOT NULL "</p>
     *
     * @param field 数据库字段
     * @return Example实例
     */
    public Example andIsNotNull(String field) {
        this.khala.andIsNotNull(field);
        return this;
    }

    /**
     * 生成带" AND "前缀" IS NOT NULL "的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"a.name", true} 两个参数，生成的SQL片段为：" AND a.name IS NOT NULL "</p>
     *
     * @param field 数据库字段
     * @param match 是否匹配
     * @return Example实例
     */
    public Example andIsNotNull(String field, boolean match) {
        this.khala.andIsNotNull(field, match);
        return this;
    }

    /**
     * 生成带" OR "前缀" IS NOT NULL "的SQL片段.
     * <p>示例：传入 {"a.name"} 参数，生成的SQL片段为：" OR a.name IS NOT NULL "</p>
     *
     * @param field 数据库字段
     * @return Example实例
     */
    public Example orIsNotNull(String field) {
        this.khala.orIsNotNull(field);
        return this;
    }

    /**
     * 生成带" OR "前缀" IS NOT NULL "的SQL片段,如果match为true时则生成该条SQL片段，否则不生成.
     * <p>示例：传入 {"a.name", true} 两个参数，生成的SQL片段为：" OR a.name IS NOT NULL "</p>
     *
     * @param field 数据库字段
     * @param match 是否匹配
     * @return Example实例
     */
    public Example orIsNotNull(String field, boolean match) {
        this.khala.orIsNotNull(field, match);
        return this;
    }


}
